package src

import (
	"log"
	"math/rand"
	"sync"
	"time"
)

// 多个生产者，单个消费者 （S s R）
// 通过消费端 关闭一个附加信号 通知生产端停止生产数据
// channel 在没有 goroutine 引用的时候会自动关闭，而不需要显示关闭

func SsRChannel() {
	rr := rand.New(rand.NewSource(time.Now().UnixNano()))
	log.SetFlags(0)

	wgReceivers := sync.WaitGroup{}
	wgReceivers.Add(1)

	dataCh := make(chan int, 100)
	stopCh := make(chan struct{})

	for i := 0; i < NumSenders; i++ {
		go func() {
			for {
				select {
				case <-stopCh:
					// 收到消费端关闭信号
					return
				default:
				}

				select {
				case <-stopCh:
					// 收到消费端关闭信号
					return
				case dataCh <- rr.Intn(MaxRandomNumber):
					// 生产端
				}
			}
		}()
	}

	go func() {
		defer wgReceivers.Done()

		for val := range dataCh {
			if val == MaxRandomNumber-1 {
				// 发送关闭信号
				close(stopCh)
				log.Println("stop", val)
				return
			}
		}
	}()

	wgReceivers.Wait()
}
